机器学习预测乳腺肿瘤性质(2)
作者:汪君,专职数据分析,Python和R爱好者
个人微信公众号:学英文和玩数据
在上一篇文章里 机器学习预测乳腺肿瘤性质(1),我们分别利用sklearnmodule中的SGD,logistic regression,svm以及random forest的四个分类器在数据集Breast Cancer Wisconsin (Diagnostic) Data Set上进行了初步的对比,发现logistic regression和random forest的效果比较好,但是由于我们是采用这些分类器的默认参数(default value),并没有进行人为参数设置,而且SGD是采取随机梯度下降的算法来完成分类,分类效果是否和随机种子的选择有关不得而知。
在本篇中,我们开始手动设置一些分类器的参数,而且不仅是做单次的五折交叉验证,将五折交叉验证的过程本身再多次重复,求准确率的平均值,看看这四个分类器的效果是否有变化,
还是先加载相关module和数据
import numpy as np
import pandas as pd
import sklearn
import matplotlib.pyplot as plt
ws_data=pd.read_csv("data.csv")
diagnosis=ws_data.diagnosis
predi_features=ws_data.iloc[:,2:32]
这次对SGD分类器和svm分类器的参数进行调整
class winsconBC:
def __init__(self,data_y,method,rand_seed=42,Nfolds=3,shuffled=True):
from sklearn.cross_validation import StratifiedKFold
self.data=data_y
self.clf=method
self.Rseed=rand_seed
self.Nfolds=Nfolds
self.shuffle=shuffled
self.classifier=method
self.sfk=StratifiedKFold(y=self.data,n_folds=self.Nfolds,random_state=self.Rseed,shuffle=self.shuffle)
def classify(self):
accuracy=list()
for TR,TS in self.sfk:
train_x,train_y=predi_features.iloc[TR,:],diagnosis[TR]
test_x,test_y=predi_features.iloc[TS,:],diagnosis[TS]
if self.classifier=="logistic":
from sklearn.linear_model import LogisticRegression
logClf=LogisticRegression()
logClf.fit(train_x,train_y)
accuracy.append(logClf.score(X=test_x,y=test_y))
if self.classifier=="SGD":
from sklearn.linear_model import SGDClassifier
SGDclf=SGDClassifier(loss="log",max_iter=1000,
learning_rate="optimal") ### 手动设置参数,详见sklearn官网
SGDclf.fit(X=train_x,y=train_y)
accuracy.append(SGDclf.score(X=test_x,y=test_y))
if self.classifier=="SVM":
from sklearn.svm import SVC
svmClf=SVC(kernel="linear",C=1) ### 这里设置kernal=linear,不再是默认的rbf
svmClf.fit(X=train_x,y=train_y)
accuracy.append(svmClf.score(X=test_x,y=test_y))
if self.classifier=="randomforest":
from sklearn.ensemble import RandomForestClassifier
rfClf=RandomForestClassifier()
rfClf.fit(train_x,train_y)
accuracy.append(rfClf.score(test_x,test_y))
return(np.array(accuracy))
再来看看它们在测试集上的表现
plt.figure()
plt.bar(np.arange(4),np.array([np.mean(winsconBC(data_y=diagnosis,method=i,Nfolds=5).classify()) for i in ["SGD",'logistic','SVM',"randomforest"]]))
plt.xticks(np.arange(4), ("SGD",'logistic','SVM',"randomforest"))
plt.axhline(0.95,c="r") #### 还是0.95的参考线
plt.show()
和前一篇文章里的效果再对比一下,发现SGD和SVM的效果都明显提升了。
把五折交叉验证的过程重复50次,看看效果
whole=list()
for i in range(20): ### 重复两百次
mean_acu_score=list()
for s in ["SGD",'logistic','SVM',"randomforest"]:
mean_acu_score.append(np.mean(winsconBC(
data_y=diagnosis,method=s,rand_seed=i,
Nfolds=5,shuffled=True).classify()))
whole.append(mean_acu_score)
test_results=np.array(whole)### 我们把200次的对比数值可视化的方式展示出来
plt.figure(figsize=(20,10))
x=np.arange(1,51)
y_SGD=test_results[:,0]
y_logistic=test_results[:,1]
y_svm=test_results[:,2]
y_rf=test_results[:,3]
L1, =plt.plot(x,y_SGD,label="a")
L2, =plt.plot(x,y_logistic,c="r",label="b")
L3, =plt.plot(x,y_svm,c="y",label="c")
L4, =plt.plot(x,y_rf,c="b",label="d")
plt.legend(handles=[L1,L2,L3,L4],labels=["SGD",'logistic','SVM',"randomforest"],loc="best")
plt.show()
调整完参数后,svm的表现整体提升,SGD波动较大,还是随机森林给力。
获取本文数据:下图扫码关注Python爱好者公众号,后台回复 data
Python爱好者社区历史文章大合集:
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
0.小编的Python入门视频课程!!!
1.崔老师爬虫实战案例免费学习视频。
2.丘老师数据科学入门指导免费学习视频。
3.陈老师数据分析报告制作免费学习视频。
4.玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
5.丘老师Python网络爬虫实战免费学习视频。